#encoding=utf-8
import sys
sys.path.append("./aima")

from search import romania

def mostrarGrafo(graph,problem):
    '''Esta função exibe em terminal o caminho percorrido e os nós expandidos
    A partir de um grafo ou árvore no formato [[A,[B,C],[D,[E,F]]] onde cada
    lista interna é um nó e uma lista de nós expandidos'''

    print "Partindo de:",problem.initial,
    print "-> Explorados:",
    for i in graph[0][1]:
        print i.strip('0123456789'),
    print
    for noh in range(1,len(graph)):
        if len((graph[noh])[1])!=0:
            print "Expandindo:",(graph[noh])[0].strip('0123456789'),
            print "-> Explorados:",
            for i in(graph[noh])[1]:
                print i.strip('0123456789'),
            print
    print

def custo(problem,solution,map):
    '''Esta função calcula o custo total do início até o objetivo dado um
    problema, a solução (uma lista de nós) e o mapa (dicionário) no qual foi
    feita a procura'''

    custo=0.0
    custo=map.get(problem.initial,solution[0])
    for i in range(len(solution)-1):
        custo+=map.get(solution[i],solution[i+1])
    return custo

def draw_graph(graph,map,solution,problem):
    '''Função que transforma o grafo ou árvore de saída em um formato exigido
    pela biblioteca pygraph por meio da função tkGraphView'''

    node_edge_old_style = []
    lista_expandidos=[]

    #if len(graph)==2:
		#graph.pop()
		#print graph
		#graph.append([ graph[0][1][0], [ graph[0][0][0] ]  ])

    for no in graph:
        lista_expandidos.append(no[0])

    lista_explorados=[]
    for no in graph:
        lista_explorados.extend(no[1])

    for no in lista_explorados:
        if no not in lista_expandidos:
            graph.append([no,[]])
    for no in graph:
        tmpnode={}
        #[A,[B,C,D]] (formato do nosso nó)
        tmpnode['node']=no[0]
        tmpnode['shape']='oval'
        tmpnode['features']=''
        tmpnode['edges']=[i for i in no[1]]
        tmplista=[]
        for nohDeChegada in no[1]:
            tmplista.append(str(map.get(no[0].strip('0123456789'),nohDeChegada.strip('0123456789'))))
        tmpnode['edgenames']=tmplista
        if no[0] not in solution and no[0]!=problem.initial:
            tmpnode['color']='green'
        else:
            tmpnode['color']='cyan'
        node_edge_old_style.append(tmpnode)
    node_edge_old_style=[x for i,x in enumerate(node_edge_old_style) if x not in node_edge_old_style[i+1:]]
    return node_edge_old_style

#def desenha_grafo(grafo,mapa):
#    '''Formata a saída da solução no formato exigido pelo pydot para salvar o grafo em arquivo de imagem
#    usando o graphviz '''
#    graph = pydot.Dot(graph_type='graph')
#    lista=[]
#    for no in grafo:
#        i=0
#        if no[0] not in lista:
#            lista.append(no[0])
#        else:
#            i+=1
#            node = pydot.Node("%s"%no[0], style="filled", fillcolor="green",label="%s"%(no[0]))
#        for subno in no[1]:
#            if subno not in lista:
#                lista.append(subno)
#                edge = pydot.Edge("%s" % repr(no[0]), "%s" % repr(subno))
#                graph.add_edge(edge)
#            else:
#                subnode = pydot.Node("%s"%repr(subno), style="filled", fillcolor="green",label="%s"%repr(subno))
#                edge = pydot.Edge(node, subnode)
#                graph.add_edge(edge)
#
#    return graph


def encontra_string_em_elemento(lista,procura):
    '''Esta função é usada para localizar um string em uma lista do tipo usada
    para gerar a lista da árvore, onde é permitido repetir nós e portanto para
    ser gerada com sucesso na biblioteca que exibe graficamente um nó que já exista
    na árvore precisa ser renomeado, e pra isso precisamos localizar o último nó adicionado
    e incluir um número após ele para ser considerado um novo nó pelo pygraph
    Ex: se o nó que repete é o A este nó deve ser renomeado para A1'''

    achou=False
    for i in range(len(lista)-1,-1,-1):
        if lista[i].find(procura)!=-1:
            achou=True
            break

    if achou:
        return i
    else:
        return None

